//
//  DMLifecycleEventDispatcher.h
//  DualMediationSDK
//
//  生命周期事件分发器
//  负责将生命周期事件分发给所有注册的监听器
//

#import <Foundation/Foundation.h>
#import "../Types/DMLifecycleTypes.h"
#import "../Types/DMLifecycleProtocols.h"
#import "DMLifecycleDelegateRegistry.h"

NS_ASSUME_NONNULL_BEGIN
/**
 * 事件分发结果
 */
typedef NS_ENUM(NSInteger, DMEventDispatchResult) {
    DMEventDispatchResultSuccess = 0,       // 分发成功
    DMEventDispatchResultPartialFailure,   // 部分监听器处理失败
    DMEventDispatchResultFailure,          // 分发失败
    DMEventDispatchResultNoListeners       // 没有监听器
};

/**
 * 事件分发统计信息
 */
@interface DMEventDispatchStatistics : NSObject
@property (nonatomic, assign) NSUInteger totalListeners;        // 总监听器数量
@property (nonatomic, assign) NSUInteger successfulDispatches;  // 成功分发数量
@property (nonatomic, assign) NSUInteger failedDispatches;      // 失败分发数量
@property (nonatomic, assign) NSTimeInterval totalDispatchTime; // 总分发时间
@property (nonatomic, assign) NSTimeInterval averageDispatchTime; // 平均分发时间
@end

/**
 * 生命周期事件分发器
 * 负责将生命周期事件和状态变化分发给所有注册的监听器
 */
@interface DMLifecycleEventDispatcher : NSObject

#pragma mark - 单例访问

/**
 * 获取事件分发器单例
 * @return 事件分发器实例
 */
+ (instancetype)sharedDispatcher;

#pragma mark - 分发配置

/**
 * 是否启用异步分发（默认YES）
 */
@property (nonatomic, assign) BOOL asyncDispatchEnabled;

/**
 * 分发超时时间（秒，默认5秒）
 */
@property (nonatomic, assign) NSTimeInterval dispatchTimeout;

/**
 * 是否启用分发统计（默认NO）
 */
@property (nonatomic, assign) BOOL statisticsEnabled;

/**
 * 最大重试次数（默认3次）
 */
@property (nonatomic, assign) NSUInteger maxRetryCount;

#pragma mark - 生命周期事件分发

/**
 * 分发生命周期事件
 * @param event 生命周期事件
 * @param state 当前生命周期状态
 * @return 分发结果
 */
- (DMEventDispatchResult)dispatchLifecycleEvent:(DMLifecycleEvent)event 
                                      withState:(DMLifecycleState)state;

/**
 * 分发生命周期事件（便捷方法，自动获取当前状态）
 * @param event 生命周期事件
 * @param userInfo 额外参数
 * @return 分发结果
 */
- (DMEventDispatchResult)dispatchLifecycleEvent:(DMLifecycleEvent)event 
                                       userInfo:(nullable NSDictionary *)userInfo;

/**
 * 分发生命周期事件（带额外参数）
 * @param event 生命周期事件
 * @param state 当前生命周期状态
 * @param userInfo 额外参数
 * @return 分发结果
 */
- (DMEventDispatchResult)dispatchLifecycleEvent:(DMLifecycleEvent)event 
                                      withState:(DMLifecycleState)state 
                                       userInfo:(nullable NSDictionary *)userInfo;

/**
 * 异步分发生命周期事件
 * @param event 生命周期事件
 * @param state 当前生命周期状态
 * @param completion 完成回调
 */
- (void)dispatchLifecycleEventAsync:(DMLifecycleEvent)event 
                          withState:(DMLifecycleState)state 
                         completion:(nullable void(^)(DMEventDispatchResult result, DMEventDispatchStatistics *statistics))completion;

/**
 * 异步分发生命周期事件（带额外参数）
 * @param event 生命周期事件
 * @param state 当前生命周期状态
 * @param userInfo 额外参数
 * @param completion 完成回调
 */
- (void)dispatchLifecycleEventAsync:(DMLifecycleEvent)event 
                          withState:(DMLifecycleState)state 
                           userInfo:(nullable NSDictionary *)userInfo
                         completion:(nullable void(^)(DMEventDispatchResult result, DMEventDispatchStatistics *statistics))completion;

#pragma mark - 状态变化分发

/**
 * 分发状态变化事件
 * @param previousState 上一个状态
 * @param currentState 当前状态
 * @param event 触发状态变化的事件
 * @return 分发结果
 */
- (DMEventDispatchResult)dispatchStateChange:(DMLifecycleState)previousState 
                                currentState:(DMLifecycleState)currentState 
                               triggerEvent:(DMLifecycleEvent)event;

/**
 * 异步分发状态变化事件
 * @param previousState 上一个状态
 * @param currentState 当前状态
 * @param event 触发状态变化的事件
 * @param completion 完成回调
 */
- (void)dispatchStateChangeAsync:(DMLifecycleState)previousState 
                    currentState:(DMLifecycleState)currentState 
                   triggerEvent:(DMLifecycleEvent)event
                     completion:(nullable void(^)(DMEventDispatchResult result, DMEventDispatchStatistics *statistics))completion;

#pragma mark - 监听器管理

/**
 * 添加生命周期事件监听器
 * @param listener 监听器对象
 */
- (void)addLifecycleEventListener:(id<DMLifecycleEventListener>)listener;

/**
 * 移除生命周期事件监听器
 * @param listener 监听器对象
 */
- (void)removeLifecycleEventListener:(id<DMLifecycleEventListener>)listener;

/**
 * 获取当前活跃的监听器数量
 * @return 监听器数量
 */
- (NSUInteger)getActiveListenerCount;

/**
 * 获取指定优先级的监听器数量
 * @param priority 优先级
 * @return 监听器数量
 */
- (NSUInteger)getListenerCountWithPriority:(NSInteger)priority;

/**
 * 检查是否有监听器监听指定事件
 * @param event 生命周期事件
 * @return YES 如果有监听器
 */
- (BOOL)hasListenersForEvent:(DMLifecycleEvent)event;

/**
 * 检查是否有监听器监听状态变化
 * @return YES 如果有监听器
 */
- (BOOL)hasStateChangeListeners;

#pragma mark - 分发控制

/**
 * 暂停事件分发
 */
- (void)pauseDispatching;

/**
 * 恢复事件分发
 */
- (void)resumeDispatching;

/**
 * 检查分发是否已暂停
 * @return YES 如果分发已暂停
 */
- (BOOL)isDispatchingPaused;

/**
 * 取消所有待处理的异步分发
 */
- (void)cancelPendingDispatches;

/**
 * 等待所有异步分发完成
 * @param timeout 超时时间（秒）
 * @return YES 如果所有分发都完成
 */
- (BOOL)waitForPendingDispatchesWithTimeout:(NSTimeInterval)timeout;

#pragma mark - 错误处理

/**
 * 分发错误处理回调
 * @param error 分发过程中的错误
 * @param event 相关的生命周期事件
 * @param listener 出错的监听器
 */
typedef void(^DMDispatchErrorHandler)(NSError *error, DMLifecycleEvent event, id<DMLifecycleEventListener> listener);

/**
 * 设置分发错误处理器
 * @param errorHandler 错误处理回调
 */
- (void)setDispatchErrorHandler:(nullable DMDispatchErrorHandler)errorHandler;

#pragma mark - 性能监控

/**
 * 获取分发统计信息
 * @return 统计信息，如果未启用统计则返回nil
 */
- (nullable DMEventDispatchStatistics *)getDispatchStatistics;

/**
 * 重置分发统计信息
 */
- (void)resetDispatchStatistics;

/**
 * 获取性能报告
 * @return 包含性能数据的字典
 */
- (NSDictionary *)getPerformanceReport;

#pragma mark - 调试支持

/**
 * 启用调试模式
 * @param enabled 是否启用
 */
- (void)setDebugModeEnabled:(BOOL)enabled;

/**
 * 获取调试信息
 * @return 包含调试信息的字典
 */
- (NSDictionary *)getDebugInfo;

/**
 * 验证分发器状态
 * @return YES 如果状态正常
 */
- (BOOL)validateDispatcherState;

/**
 * 导出分发日志
 * @param limit 日志条数限制，0表示全部
 * @return JSON格式的日志字符串
 */
- (nullable NSString *)exportDispatchLogWithLimit:(NSUInteger)limit;

@end

NS_ASSUME_NONNULL_END
